package day0802;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.net.URL;
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;

public class GameWin  extends  JPanel{

    void moveAllFlys(){

        hero.move();

        for(int i=0;i<enemyPlanes.size();  i++) {//用循环取出enemyPlanes里边每个敌方飞机
            FlyingObject e=enemyPlanes.get(i);//从集合中用get(元素编号)取出一个敌方飞机对象
            e.move();   // 调用敌方飞机的move方法
        }//这里涉及到一个java语法知识点：上一行是调用对象e的move方法，实际执行的是具体敌方飞机对象的move方法，
        //但e变量的类型是FlyingObject的类中必须也有一个move方法，因为父类型变量FlyingObject e=子类型对象，这种格式
        //定义对象时，父类型FlyingObject和具体的子类型都要定义move()方法

        for(int i=0;i<bullets.size();  i++) {//用循环取出bullets里边每个子弹
            Bullet b=bullets.get(i);//从集合中用get(元素编号)取出一个子弹对象
            b.move();   // 调用子弹的move方法
        }
    }



    ArrayList<Bullet>  bullets=new ArrayList<Bullet>();
    //創建子彈，并将子弹添加到bullets数组中的方法
    int creatBulletCount=1;
    void createBullets() {
       if(creatBulletCount%5==0){
          //Bullet b=new Bullet();//创建一个子弹对象
          ArrayList<Bullet> bs=hero.shoot();
          //bullets.add(b);//将创建的子弹放入到集合中
          //将本次hero飞机创建的子弹集合bs放入到存所有子弹的集合中bullets中
          bullets.addAll(bs);
       }
        creatBulletCount++;
    }//还需要在main方法中调用createBullets()方法




    ArrayList<FlyingObject>  enemyPlanes=new ArrayList<FlyingObject>();
    //創建敌方飞机，并将敌方飞机添加到enemyPlanes集合中的方法createEnemyPlane
    int creatPlaneCount=1;
    void createEnemyPlane() {
        if(creatPlaneCount%10==0){
            int typeRanNum=(int)(Math.random()*3);
            //FlyingObject b=new SmallPlane();//创建一个敌方飞机对象
            //将上边的代码换成下边根据随机数范围创建不同的敌方飞机(比如随
            //机数是0就创建敌方小飞机，随机数如果是1就创建敌方大飞机，
            // 随机数如果是2就创建敌方大Boss飞机)
            FlyingObject b=null;
            if(typeRanNum==0){
                b=new SmallPlane();
            }else if(typeRanNum==1){
                //b=new SmallPlane();
                //将上边一行代码换成下边创建敌方大飞机的代码
                b=new BigPlane();
            }else{
                b=new SmallPlane();//后边换成创建敌方大Boss
            }
            enemyPlanes.add(b);//将创建的子弹放入到集合中
        }
        creatPlaneCount++;
    }//还需要在main方法中调用createBullets()方法


    HeroPlane hero=new HeroPlane();
    public void paint(Graphics g){
        ImageIcon imgIcon=new ImageIcon("images/background.png");//读取图片
        g.drawImage(imgIcon.getImage(),0,0,null);
        //绘制图片到0,0点(左上角坐标定义为0,0)
        g.drawString("life:", 10,20);//绘制//画画的代码
        g.drawString("score:", 10,40);//绘制//画画的代码
        g.drawString("quit:Q/q:", 10,60);//绘制//画画的代码

        //绘制Hero飞机
        g.drawImage(hero.img,hero.x,hero.y,null);

        for (int i = 0; i <enemyPlanes.size(); i++) {//循环取出enemyPlanes集合中的每个敌方飞机，将图片用drawImage()绘制
            FlyingObject e=enemyPlanes.get(i);
            g.drawImage(e.img,e.x,e.y,null);
        }


        for (int i = 0; i <bullets.size(); i++) {//循环取出bullets集合中的每个子弹，将图片用drawImage()绘制
            Bullet b=bullets.get(i);
            g.drawImage(b.img,b.x,b.y,null);
        }
    }

    void startGame(){
        MouseAdapter ma=new MouseAdapter(){
            public void mouseMoved(MouseEvent e) {
                hero.moveTo(e.getX(),e.getY());
            }

            public void mouseEntered(MouseEvent e) {//鼠标移入窗口中自动触发执行的方法
                //鼠标移入窗口中，会自动执行本方法:
                //这四行代码的作用：  隐藏鼠标的箭头光标(鼠标移入到窗口中就没有箭头光标了)
                URL classUrl = this.getClass().getResource("");
                Image imageCursor = Toolkit.getDefaultToolkit().getImage(classUrl);
                setCursor(Toolkit.getDefaultToolkit().createCustomCursor(
                        imageCursor,  new Point(0, 0), "cursor"));
            }
        };
        this.addMouseListener(ma);
        this.addMouseMotionListener(ma);


        while(true){

            try {
                Thread.sleep(80);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            createBullets();
            createEnemyPlane();
            moveAllFlys();
            //只要游戏有一点儿改变，就要用repaint()方法调用paint()方法绘制所有内容。
            repaint();//重新调用paint()方法的意思  (绘制文字，绘制背景图，绘制子弹)
        }
    }

    public static void main(String[] args) {
        JFrame win=new JFrame();
        GameWin pane=new GameWin();//2.
        win.setSize(420,700);
        win.add(pane);
        win.setVisible(true);
        pane.startGame();
    }
}
